Skip to content

Add GLM-5.2 B200 Dynamo-SGLang AgentX configs - #2995

Merged
adibarra merged 7 commits into
mainfrom
glm5.2-fp4-b200-dynamo-sglang-agentic-upstream
Sep 15, 2026
Merged

adibarra merged 7 commits into
mainfrom
glm5.2-fp4-b200-dynamo-sglang-agentic-upstream

Conversation

@nvpohanh

@nvpohanh nvpohanh commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

Add a GLM-5.2 NVFP4 B200 Dynamo-SGLang AgentX curve on the NScale runner.

The curve includes Pareto aggregate TP8 points at concurrency 1, 4, and 8, plus disaggregated configurations at concurrency 48 and 64. All points use the same Dynamo-SGLang framework identity for dashboard grouping.

The recipes use the 2026-09-10 SGLang nightly, bundled Dynamo 1.5.0.dev20260909, EAGLE speculative decoding, and 110 GB HiCache write-back DRAM offload.


Note

Low Risk
Changes are benchmark recipes, sweep metadata, and Slurm launcher wiring only; no application runtime or auth logic is modified.

Overview
Adds GLM-5.2 NVFP4 agentic-coding benchmark coverage on B200 NScale via Dynamo + SGLang: five new srt-slurm recipes (aggregated TP8 at concurrency 1/4/8, disaggregated 1P(DEP8)+4D(TP4)@48 and 1P(DEP8)+1D(DEP8)@64) with EAGLE MTP, HiCache write-back, and agentic_srt.sh harness wiring.

Registers glm5.2-fp4-b200-dynamo-sglang-agentic-agg and -disagg in nvidia-master.yaml, documents the curve in perf-changelog.yaml, and extends launch_b200-nscale-slurm.sh to stage glm5.2 checkpoints, allow dynamo-sglang + mtp, copy recipes from a pinned srt-slurm v1.0.53 tree, skip login-node preflight, and only bump health-check max_attempts to 720 when the recipe requests less (preserving GLM’s 1440×10s load budget).

Reviewed by Cursor Bugbot for commit 9968d3e. Bugbot is set up for automated code reviews on this repo. Configure here.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want higher recall? High effort reviews run extra passes and find more bugs. A team admin can switch effort levels in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 97ccdd4. Configure here.

Comment thread runners/launch_b200-nscale-slurm.sh

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Beyond the inline findings, I also checked the model.container: "dynamo-sglang" vs. image: lmsysorg/sglang:... mismatch flagged as a candidate issue — this matches the existing convention used by the sibling deepseek-v4 agentic recipes (e.g. disagg-gb300-*-mtp-kvoffload.yaml, agg-gb300-tp8-mtp-lowlatency.yaml), where container is a launcher alias key (mapped to the squash file in launch_b200-nscale-slurm.sh) rather than a literal image reference, so it is not a violation here.

Extended reasoning...

This run's inline findings cover the missing --no-preflight exemption for the node-local NVMe GLM-5.2 model path, the pre-existing sed that halves the new recipes' 4-hour health-check load budget to 2 hours, and the copy-pasted SGLANG_DSV4_REASONING_EFFORT env var that silently no-ops instead of the correct SGLANG_REASONING_EFFORT. Those are substantive enough that a human should review before merge, so I am not approving.

I additionally verified the ruled-out candidate about model.container (literal dynamo-sglang) differing from the master image (lmsysorg/sglang:nightly-dev-20260910-00840301). AGENTS.md's rule that model.container must equal image for image bumps is written with the direct-image recipes in mind (e.g. deepseek-v4/8k1k/*.yaml, which do set container to the literal sglang image string). The new glm5.2 agentic recipes instead follow the exact pattern already used by the sibling deepseek-v4 agentic recipes, where container: "dynamo-sglang" is a launcher alias resolved by runners/launch_b200-nscale-slurm.sh (mapped to SQUASH_FILE), not a literal image reference — so this is consistent with established convention, not a new inconsistency introduced by this PR.

Additional findings (outside the current diff — GitHub can't attach inline comments there):

  • 🔴 runners/launch_b200-nscale-slurm.sh — New glm5.2/fp4 lane sets MODEL_PATH under $NSCALE_MODEL_ROOT (/scratch/models), the same node-local-NVMe-only storage that is why dsv4/kimik2.6/kimik3 are exempted from srtctl preflight via --no-preflight here, but glm5.2 was not added to that exemption list. Result: every GLM-5.2 multi-node job runs srtctl apply with preflight enabled, and its Path.is_dir() stat on model.path executes from the login node where /scratch/models isn't mounted, failing the job before sbatch submission. Fix: add $MODEL_PREFIX == "glm5.2" to the SRTCTL_PREFLIGHT_ARGS no-preflight condition alongside kimik2.6/kimik3/dsv4.

    Extended reasoning...

    Line 53 sets MODEL_PATH="${MODEL_PATH:-$NSCALE_MODEL_ROOT/GLM-5.2-NVFP4}"; lines 19-21 document NSCALE_MODEL_ROOT as node-local NVMe, 'not a shared filesystem', pre-staged only on compute nodes. Lines 368-372 build SRTCTL_PREFLIGHT_ARGS and add --no-preflight only for kimik2.6/kimik3/dsv4 ('These weights are staged on the Slurm compute nodes, not the login node'), the exact rationale that also applies to glm5.2's identical NSCALE_MODEL_ROOT path. Comments in launch_gb200-nv.sh:734-736 and launch_gb300-nv.sh:543 confirm srtctl's preflight is an in-process Path.is_dir() stat run before sbatch, on the submission host. Since glm5.2 isn't in the skip list, srtctl apply at line 374 runs with preflight enabled for glm5.2 jobs, the stat fails against the unmounted /scratch/models path, and the job never reaches sbatch.

    Verification: normal. The new glm5.2/fp4 lane sets MODEL_PATH=/scratch/models/GLM-5.2-NVFP4 (launch_b200-nscale-slurm.sh:52-55), where NSCALE_MODEL_ROOT=/scratch/models is documented as node-local NVMe, "not a shared filesystem," pre-staged only on compute nodes (lines 19-21). The preflight exemption at lines 366-372 adds --no-preflight only for kimik2.6, kimik3, dsv4 ("These weights are staged on the…

  • 🔴 runners/launch_b200-nscale-slurm.sh — New GLM-5.2 B200 recipes set health_check.max_attempts: 1440 (4h load budget) but this pre-existing sed unconditionally rewrites it to 720 (2h) before every b200-nscale job, silently halving the load-time budget the recipe author explicitly chose for this larger model. All prior agentic recipes on this runner (kimik3, glm5.1) already used 720, so this override was a no-op until now; GLM-5.2 is the first case where it actually clobbers a larger, intentional value. Fix: only overwrite max_attempts when it is smaller than the recipe's own value (e.g. take the max), or drop the override for agentic recipes that already declare their own health-check budget.

    Extended reasoning...

    runners/launch_b200-nscale-slurm.sh:138-149 (new) points CONFIG_FILE at e.g. agg-b200-tp8-c1-mtp.yaml, whose health_check block (lines 98-100) sets max_attempts: 1440, interval_seconds: 10 -- a 4-hour budget the recipe comment implies is needed for this model's load. Line 362 (pre-existing, untouched by this diff) runs sed -i 's/^ max_attempts: [0-9]*/ max_attempts: 720/' on CONFIG_PATH, which matches the exact two-space-indented 'max_attempts: 1440' line and rewrites it to 720, halving the budget to 2 hours before srtctl ever reads the file. If GLM-5.2's model load genuinely needs more than 7200s (as the recipe author's chosen value suggests), the health check will time out and the job will be marked unhealthy/fail even though the base cluster script never previously overrode a larger value like this, because every earlier agentic recipe on this runner already used 720.

    Verification: normal. New GLM-5.2 b200-fp4 recipes deliberately set max_attempts: 1440 (two-space indent) — confirmed in all five files: agg-b200-tp8-c1-mtp.yaml:99, agg-b200-tp8-c4-mtp.yaml:99, agg-b200-tp8-c8-mtp.yaml:99, disagg-b200-1p1d-dep8-dep8-c64-mtp.yaml:169, disagg-b200-1p4d-dep8-tp4-c48-mtp.yaml:161. configs/nvidia-master.yaml wires glm5.2-fp4-b200-dynamo-sglang-agentic-agg/-disagg to runner…

SGLANG_USE_MESSAGE_QUEUE_BROADCASTER: '0'
SGLANG_ENABLE_TP_MEMORY_INBALANCE_CHECK: '0'
SGLANG_DEFAULT_THINKING: '1'
SGLANG_DSV4_REASONING_EFFORT: max

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 New GLM-5.2 B200 recipes set SGLANG_DSV4_REASONING_EFFORT: max instead of the generic SGLANG_REASONING_EFFORT that every other existing GLM-5.2 recipe (gb200, gb300) uses — a copy-paste artifact from the DeepSeek-V4 templates. Fix: rename the env var to SGLANG_REASONING_EFFORT in all 5 new recipe files (both agg single-block and disagg prefill/decode blocks) to match the established GLM-5.2 convention.

Extended reasoning...

The recipe's own comment says acceptance is pinned to a golden AL measured with reasoning forced to 'max' (thinking-on), but sglang for GLM-5.2 reads SGLANG_REASONING_EFFORT, not the DSV4-specific variable copied in here. Because the wrong-named var is silently ignored (no error), the server runs with default (not forced-max) reasoning effort, so the actual acceptance length/output distribution diverges from the golden calibration the SGLANG_SIMULATE_ACC_* settings assume, silently skewing the new curve's throughput/latency numbers relative to what the dashboard expects for this framework identity. All 5 new files (agg c1/c4/c8 and both disagg configs) have this same wrong var name at both prefill_environment and decode_environment (or aggregated_environment) blocks.

Verification: normal (new-file correctness). The 5 new GLM-5.2 b200 recipes set the DeepSeek-V4-specific env var SGLANG_DSV4_REASONING_EFFORT: max (agg-b200-tp8-c1-mtp.yaml:76, c4:76, c8:76; disagg-b200-1p4d-...-c48-mtp.yaml:56,79; disagg-b200-1p1d-...-c64-mtp.yaml:56,79) instead of the generic SGLANG_REASONING_EFFORT that every pre-existing GLM-5.2 recipe uses (e.g.… | normal. The 5 new GLM-5.2 B200…

…o-sglang-agentic-upstream

# Conflicts:
#	perf-changelog.yaml
@nvpohanh

Copy link
Copy Markdown
Collaborator Author

[by Codex] Addressed the review findings in 69a3ba9:

  • Added GLM-5.2 to the node-local model preflight exemption.
  • Preserved recipe-specific health-check budgets at or above 720 attempts, so the GLM-5.2 value remains 1440.
  • Replaced SGLANG_DSV4_REASONING_EFFORT with SGLANG_REASONING_EFFORT in all five recipes.
  • Merged current main and kept this PR's changelog entry appended last.

Validation: all five recipes load through srtctl, 297 matrix tests pass, launcher syntax passes, and changelog generation produces the intended Dynamo-SGLang concurrency points 1/4/8/48/64.

…o-sglang-agentic-upstream

# Conflicts:
#	perf-changelog.yaml
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

3 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@kedarpotdar-nv

Copy link
Copy Markdown
Collaborator

/reuse-sweep-run 34580793856

@kedarpotdar-nv

Copy link
Copy Markdown
Collaborator

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this.
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this.
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified against the current MODELS.md that this PR does not submit a deprecated model, scenario, or model-scenario combination.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; FLOPs at lower precisions is fine, given that the config passes private evals. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every single-node vLLM/SGLang recipe in this PR is documented in the official vLLM recipes and/or the SGLang cookbook:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If this PR uses append-only: true, verified that it only adds generated points or recipe variants inside a selected existing config/scenario and existing same-image visual curve: every previously generated point remains present with the same recipe, no prior point is removed or rerun, and every benchmark-affecting change in the complete diff can affect only the corresponding newly appended points (never an existing point), regardless of which file contains it.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.

Additional detail section:

  • The authorized reused sweep and eval workflow passed on current head e937ff684986212b77edaae64596f5d9a4277ce6.
  • All five benchmark configurations passed at concurrency 1, 4, 8, 48, and 64, with zero profiled request errors.
  • Both GSM8K evals passed verification: 0.9682 at concurrency 48 and 0.9629 at concurrency 64.
  • The aggregated MTP recipes use the committed thinking-on three-step AL of 2.99; the disaggregated recipes use the committed two-step AL of 2.50. AgentX uses the chat-completions path, and thinking/max reasoning is explicitly enabled.
  • GLM-5.2 Agentic coding with native MTP is active in MODELS.md.
  • The submission uses the upstream lmsysorg/sglang:nightly-dev-20260910-00840301 image. This PR adds only multi-node Dynamo-SGLang recipes, so the single-node cookbook requirement is not applicable.
  • No architecture-reducing overrides, serving-stack patches, or append-only: true changes are present.

Signed: kedarpotdar-nv

@Klaud-Cold

Copy link
Copy Markdown
Collaborator

✅✅✅ Verdict: PASS ✅✅✅

✅ Check 0 (CODEOWNER): PASS — @kedarpotdar-nv is a named owner of configs/nvidia-master.yaml; the remaining changed paths fall under the catch-all, which any recognized CODEOWNER satisfies.
✅ Check 1 (Passing sweep on in-PR commit): PASS — head e937ff6 carries run 34580793856 with all five multi-node agentic / jobs and both multi-node agentic eval / jobs at success (executed, not skipped).
✅ Check 2 (Evals pass): PASS — GSM8K em_strict 0.9682 (1P4D c48) and 0.9629 (1P1D c64), n_eff 1319 each, above the 0.90 default threshold in infx/evals/thresholds.yaml; eval jobs ran on lmsysorg/sglang:nightly-dev-20260910-00840301, the same image as the PR configs, and the eval-only path strips simulated acceptance.
➖ Check 3 (Recipe linked/merged): N/A — disaggregated/multi-node submission (all recipes under benchmarks/multi_node/srt-slurm-recipes/**, both master entries multinode: true); the recipe-link requirement applies to single-node recipes only.
✅ Check 4 (Reuse command): PASS — /reuse-sweep-run 34580793856 posted by kedarpotdar-nv (COLLABORATOR) on 2026-09-14.
✅ Check 5 (Latest checklist): PASS — all 14 items of the current docs/PR_REVIEW_CHECKLIST.md template are present and checked.
✅ Check 6 (Upstream image / engine-first): PASS — both new entries use upstream lmsysorg/sglang:nightly-dev-20260910-00840301; the dynamo-sglang framework is preceded by the existing glm5.2-fp4-b200-sglang-agentic-mtp entry (framework: sglang, runner: cluster:b200-nscale).
✅ Check 7 (Deprecated models/scenarios): PASS — glm5.2 Agentic coding with the MTP arm is active in MODELS.md as of 2026-09-14.
✅ Check 8 (No architecture hacks): PASS — no --hf-overrides / --json-model-override-args / model-config edits; only NVFP4 weights with FP8 KV cache (precision, not FLOPs).
✅ Check 9 (Spec-decode via chat template): PASS — EAGLE configs are driven by agentic_srt.sh, whose replay command targets /v1/chat/completions with --endpoint-type chat.
✅ Check 10 (No engine patches): PASS — launcher changes only clone the srt-slurm harness at a pinned tag and edit recipe YAML fields; no engine source, wheel, or container file is modified.
✅ Check 11 (Agentic spec-decode golden AL): PASS — aggregated recipes pin SGLANG_SIMULATE_ACC_LEN: 2.99 (3 steps, thinking on) and disaggregated recipes pin 2.5 (2 steps), both with match-expected / real-draft-token, matching golden_al_distribution/glm5.2_mtp.yaml thinking_on values 2.99 and 2.50.
➖ Check 12 (Append-only): N/A — the new perf-changelog.yaml entry does not set append-only: true.

@adibarra
adibarra merged commit 389a064 into main Sep 15, 2026
31 checks passed
@adibarra
adibarra deleted the glm5.2-fp4-b200-dynamo-sglang-agentic-upstream branch September 15, 2026 00:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants